热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

设计实战|10个Kotlin项目深度解析:首页模块开发详解

篇首语:本文由编程笔记#小编为大家整理,主要介绍了10Kotlin项目实操之首页模块相关的知识,希望对你有一定的参考价值。 (1)一个人只要自己不放弃自己&#xff0c

篇首语:本文由编程笔记#小编为大家整理,主要介绍了10Kotlin项目实操之首页模块相关的知识,希望对你有一定的参考价值。




(1)一个人只要自己不放弃自己,整个世界也不会放弃你.
(2)天生我才必有大用
(3)不能忍受学习之苦就一定要忍受生活之苦,这是多么痛苦而深刻的领悟.
(4)做难事必有所得
(5)精神乃真正的刀锋
(6)战胜对手有两次,第一次在内心中.
(7)好好活就是做有意义的事情.
(8)亡羊补牢,为时未晚
(9)科技领域,没有捷径与投机取巧。
(10)有实力,一年365天都是应聘的旺季,没实力,天天都是应聘的淡季。
(11)基础不牢,地动天摇
(12)写博客初心:成长自己,辅助他人。当某一天离开人世,希望博客中的思想还能帮人指引方向.
(13)编写实属不易,若喜欢或者对你有帮助记得点赞+关注或者收藏哦~



【10】Kotlin项目实操之首页模块

文章目录


  • 【10】Kotlin项目实操之首页模块
    • 1.OkHttp网络请求模式
      • 1.1设计图
      • 1.2请求服务器API接口
      • 1.3服务器响应的封装
      • 1.4请求服务器API的具体实现

    • 2.用户请求流程图
      • 2.1请求流程图
      • 2.1请求响应实现

    • 3.打赏鼓励
      • 3.1微信打赏
      • 3.2支付宝打赏




1.OkHttp网络请求模式

(1)写代码应该先将接口写出来,按照接口标准来具体实现


1.1设计图

(1)使用OkHttp去访问服务器,最终一定会有一个成功与失败
(2)这个成功与失败,严格来讲就是一个Callback回调
(3)对这个Callback再次封装,便于控制成功与失败的操作。
(4)为什么这么设计?


  • 因为异步请求服务器,就会有成功与失败,没有封装之前,这个成功与失败的响应结果是异步的。
  • 而封装的目的一是为了将异步的成功与失败结果变成主线程,二是为了做数据过滤

1.2请求服务器API接口

/**
* @author XiongJie
* @version appVer
* @Package com.gdc.kotlinproject.data_model.local.request
* @file
* @Description:
*
* 1.请求服务器的一系列接口
*
* @date 2021-6-5 10:24
* @since appVer
*/

interface IRequest
/**
* 1.无参数
* (1)NetWorkResultData:响应成功或失败的数据
*/

fun instanceRequestAction(url:String,resultData: NetWorkResultData)
/**
* 1.有1个参数的
*/

fun instanceRequestAction(url:String,value:String,resultData: NetWorkResultData)
/**
* 1.有2个参数的
*/

fun instanceRequestAction(url:String,value1:String,value2:String,resultData: NetWorkResultData)
/**
* 1.有3个参数的
*/

fun instanceRequestAction(url:String,value1:String,value2:String,value3:String,resultData: NetWorkResultData)
/**
* 用map做参数
*/

fun instanceRequestAction(url:String,resultData: NetWorkResultData,parameter:Map<String,String>)


1.3服务器响应的封装

/**
* &#64;author XiongJie
* &#64;version appVer
* &#64;Package com.gdc.kotlinproject.local.request
* &#64;file
* &#64;Description:
* 1.对异步回调的封装
* &#xff08;1&#xff09;使用OkHttp去访问服务器,最终一定会有一个成功与失败
* &#xff08;2&#xff09;这个成功与失败&#xff0c;严格来讲就是一个Callback回调
* &#xff08;3&#xff09;对这个Callback再次封装&#xff0c;便于控制成功与失败的操作。
* &#xff08;4&#xff09;为什么这么设计&#xff1f;
* - 因为异步请求服务器&#xff0c;就会有成功与失败&#xff0c;没有封装之前&#xff0c;这个成功与失败的响应结果是异步的。
* - 而封装的目的一是为了将异步的成功与失败结果变成主线程,二是为了做数据过滤
*
* &#64;date 2021-6-5 18:14
* &#64;since appVer
*/

abstract class NetWorkResultData : Callback
/**
* 1.封装前的失败
* 1.1使用Handler切换到主线程调用封装后的失败
* 1.2确保在主线程执行
*/

override fun onFailure(call: Call, e: IOException)
Log.e(Flag.TAG, ">>>>>>>>>>>>>>>>>>>>>>>>>> onFailure: use okhttp network request TO Exception: $e.message" );
Handler(Looper.getMainLooper(),object :Handler.Callback
override fun handleMessage(msg: Message): Boolean
//1.1.拿到信息message不为空的情况下执行let里面的内容 it&#61;&#61;message本身
e.message ?.let requestError(it)
//1.2.为了保证系统继续执行&#xff0c;return false
return false;

).sendEmptyMessage(0)

/**
* 1.封装前的成功
* 1.1使用Handler切换到主线程调用封装后的成功,确保在主线程执行
*/

override fun onResponse(call: Call, response: Response)
Handler(Looper.getMainLooper(),Handler.Callback
requestSuccess(response)
false
).sendEmptyMessage(0)

/**
* 1.封装后的失败
*/

abstract fun requestError(info : String)
/**
* 1.封装后的成功
* 拿到的是Okhttp的响应结果
*/

abstract fun requestSuccess(result:Response)


1.4请求服务器API的具体实现

/**
* &#64;author XiongJie
* &#64;version appVer
* &#64;Package com.gdc.kotlinproject.local.request
* &#64;file
* &#64;Description:
* 1.请求服务器API的具体实现
* &#xff08;1&#xff09;.不使用派生单例&#xff0c;直接写object才是真正的单例
* &#xff08;2&#xff09;.派生与object实现单例时尽量使用object
* &#xff08;3&#xff09;.如果需要给单例传递参数&#xff0c;则使用派生更好
* fun instanceRequestAPI(context:Context):IRequest &#61; RequestAPI()
* &#64;date 2021-6-5 18:40
* &#64;since appVer
*/

object RequestAPI : IRequest
/**
* 派生单例
*/

/*companion object
fun instanceRequestAPI():IRequest &#61; RequestAPI()
*/

/**
* 无参数
*/

override fun instanceRequestAction(url: String, resultData: NetWorkResultData)

/**
* 1个参数
*/

override fun instanceRequestAction(url: String, value: String, resultData: NetWorkResultData)
commonOKHttpRequestAction(url,resultData,value)

/**
* 2个参数
*/

override fun instanceRequestAction(
url: String,
value1: String,
value2: String,
resultData: NetWorkResultData
)
commonOKHttpRequestAction(url,resultData,value1,value2)

/**
* 3个参数
*/

override fun instanceRequestAction(
url: String,
value1: String,
value2: String,
value3: String,
resultData: NetWorkResultData
)
commonOKHttpRequestAction(url,resultData,value1,value2,value3)

/**
* Map多个参数
*/

override fun instanceRequestAction(
url: String,
resultData: NetWorkResultData,
parameter: Map<String, String>
)

/** TODO ********************** 下面这一系列都是 OKHTTP 执行请求逻辑相关的 ************************/
/**
* 1.可变参数的情况
* 1.1可变参数可以改为一个实体Bean类型的
* 1.2此处是为了展示可变参数的形式,解决传递多个参数的问题
*/

private fun commonOKHttpRequestAction(url:String , resultData : NetWorkResultData, vararg values:String)
//1.创建一个OkHttpClient对象
val okHttpclient &#61; OkHttpClient()
//2.构建参数的body MultipartBody.FORM表单形式
val builder:MultipartBody.Builder &#61; MultipartBody.Builder().setType(MultipartBody.FORM)
//3.参数根据可变参数的数量变化而变化
for(value in values)
//3.1封装参数
builder.addFormDataPart(Flag.PART,value)

//4.构建一个请求
//4.1post提交里面是参数的builder
//4.2url()请求路径
val request:Request &#61; Request.Builder()
.url(url)
.post(builder.build())
.build()
//5.发送一个请求给服务器
okHttpclient.newCall(request).enqueue(resultData)



2.用户请求流程图


2.1请求流程图


2.1请求响应实现

/**
* &#64;author XiongJie
* &#64;version appVer
* &#64;Package com.gdc.kotlinproject.modules.home
* &#64;file
* &#64;Description:
* 1.首页的Fragment
* &#xff08;1&#xff09;不使用MVP
* &#64;date 2021-6-4 18:09
* &#64;since appVer
*/

class HomeFragment:Fragment()
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View?
Toast.makeText(activity, "首页", Toast.LENGTH_SHORT).show()
val root: View? &#61; inflater.inflate(R.layout.fragment_home, container, false) // null
return root ?: super.onCreateView(inflater, container, savedInstanceState)

init
setHasOptionsMenu(true)

override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater)
super.onCreateOptionsMenu(menu, inflater)
inflater.inflate(R.menu.personal_menu, menu)

override fun onActivityCreated(savedInstanceState: Bundle?)
super.onActivityCreated(savedInstanceState)
requestHomeData()

/**
* 1.请求服务器接口数据并解析
*/

private fun requestHomeData()
RequestAPI.instanceRequestAction(Flag.SERVER_URL,"1",object :NetWorkResultData()
//1.1失败 主线程完成 已经在NetworkResultData切换为主线程执行
override fun requestError(info: String)
Log.e(Flag.TAG, "requestHomeData requestError info:$info")
showResultError(info)

//1.2成功 主线程完成 已经在NetworkResultData切换为主线程执行
override fun requestSuccess(result: Response)
try
val resultData &#61; result.body()?.string().toString()
Log.e(Flag.TAG,
"成功 数据在response里面 获取后台给我们的JSON 字符串 resultData:$resultData")
//1.2.1Gson解析成可操作的对象
val gson &#61; Gson()
val homeDataResponse: HomeDataResponse &#61; gson.fromJson(resultData,HomeDataResponse::class.java)
showResultSuccess(homeDataResponse)
catch (e: Exception)
e.printStackTrace()
Log.e(Flag.TAG, "requestSuccess 解析数据时Exception:$e.message")


)

/**
* 首页的画面展示【成功】
*/

private fun showResultSuccess(result: HomeDataResponse)
text_home.text &#61; "欢迎同学们的到来>>>>>>>>>>>"
home_listview.adapter &#61; context?.myRun
HomeInfoListAdapter(it,result.data.news_list)

//两者图片的显示
Glide.with(iv_top).load(result.data.company_list[0].image).into(iv_top)
Glide.with(iv_bottom).load(result.data.ad_list[0].image).into(iv_bottom)

/**
* 首页的画面展示【失败】
*/

private fun showResultError(errorMsg: String)
Toast.makeText(activity, "首页数据请求失败: errorMsg:$errorMsg", Toast.LENGTH_SHORT).show()


/**
* 调用高阶函数
*/

fun <T, R> T.myRun(m: (T) -> R) : R &#61; m(this)

3.打赏鼓励

感谢您的细心阅读&#xff0c;您的鼓励是我写作的不竭动力&#xff01;&#xff01;&#xff01;


3.1微信打赏


3.2支付宝打赏


推荐阅读
  • 本文探讨了利用Java实现WebSocket实时消息推送技术的方法。与传统的轮询、长连接或短连接等方案相比,WebSocket提供了一种更为高效和低延迟的双向通信机制。通过建立持久连接,服务器能够主动向客户端推送数据,从而实现真正的实时消息传递。此外,本文还介绍了WebSocket在实际应用中的优势和应用场景,并提供了详细的实现步骤和技术细节。 ... [详细]
  • Java中处理NullPointerException:getStackTrace()方法详解与实例代码 ... [详细]
  • 如果程序使用Go语言编写并涉及单向或双向TLS认证,可能会遭受CPU拒绝服务攻击(DoS)。本文深入分析了CVE-2018-16875漏洞,探讨其成因、影响及防范措施,为开发者提供全面的安全指导。 ... [详细]
  • HBase Java API 进阶:过滤器详解与应用实例
    本文详细探讨了HBase 1.2.6版本中Java API的高级应用,重点介绍了过滤器的使用方法和实际案例。首先,文章对几种常见的HBase过滤器进行了概述,包括列前缀过滤器(ColumnPrefixFilter)和时间戳过滤器(TimestampsFilter)。此外,还详细讲解了分页过滤器(PageFilter)的实现原理及其在大数据查询中的应用场景。通过具体的代码示例,读者可以更好地理解和掌握这些过滤器的使用技巧,从而提高数据处理的效率和灵活性。 ... [详细]
  • 深入解析 Vue3 中的响应式 API:shallowReactive、shallowRef、triggerRef 和 customRef 的使用与原理
    深入解析 Vue3 中的响应式 API:shallowReactive、shallowRef、triggerRef 和 customRef 的使用与原理 ... [详细]
  • 在ASP.NET中,实现页面间数据传递有多种技术方案。其中一种常见方法是通过URL链接地址传递参数,例如在 `send.aspx` 页面中,可以通过点击按钮将数据附加到URL中,然后在目标页面 `receive.aspx` 中解析这些参数。此外,还可以利用Session、ViewState、Cookie等机制来实现跨页面的数据共享,每种方法都有其适用场景和优缺点。 ... [详细]
  • 本文全面解析了 gRPC 的基础知识与高级应用,从 helloworld.proto 文件入手,详细阐述了如何定义服务接口。例如,`Greeter` 服务中的 `SayHello` 方法,该方法在客户端和服务器端的消息交互中起到了关键作用。通过实例代码,读者可以深入了解 gRPC 的工作原理及其在实际项目中的应用。 ... [详细]
  • FastDFS Nginx 扩展模块的源代码解析与技术剖析
    FastDFS Nginx 扩展模块的源代码解析与技术剖析 ... [详细]
  • 本文深入探讨了CGLIB BeanCopier在Bean对象复制中的应用及其优化技巧。相较于Spring的BeanUtils和Apache的BeanUtils,CGLIB BeanCopier在性能上具有显著优势。通过详细分析其内部机制和使用场景,本文提供了多种优化方法,帮助开发者在实际项目中更高效地利用这一工具。此外,文章还讨论了CGLIB BeanCopier在复杂对象结构和大规模数据处理中的表现,为读者提供了实用的参考和建议。 ... [详细]
  • 如何使用和示例代码解析 org.semanticweb.owlapi.model.OWLSubPropertyChainOfAxiom.getPropertyChain() 方法 ... [详细]
  • 深入解析Spring Boot启动过程中Netty异步架构的工作原理与应用
    深入解析Spring Boot启动过程中Netty异步架构的工作原理与应用 ... [详细]
  • 本文深入解析了Spring Cloud路由网关Zuul的核心功能及其典型应用场景。通过对方志朋老师教材的学习和实践,详细探讨了Zuul在微服务架构中的重要作用,包括请求路由、过滤器链管理以及服务动态扩展等关键特性。同时,结合实际案例,展示了Zuul在高并发和复杂业务场景下的应用优势,为读者提供了全面的技术参考。 ... [详细]
  • 本文详细探讨了Zebra路由软件中的线程机制及其实际应用。通过对Zebra线程模型的深入分析,揭示了其在高效处理网络路由任务中的关键作用。文章还介绍了线程同步与通信机制,以及如何通过优化线程管理提升系统性能。此外,结合具体应用场景,展示了Zebra线程机制在复杂网络环境下的优势和灵活性。 ... [详细]
  • Java SE 文件操作类详解与应用
    ### Java SE 文件操作类详解与应用#### 1. File 类##### 1.1 File 类概述File 类是 Java SE 中用于表示文件和目录路径名的对象。它提供了丰富的方法来操作文件和目录,包括创建、删除、重命名文件,以及获取文件属性和信息。通过 File 类,开发者可以轻松地进行文件系统操作,如检查文件是否存在、读取文件内容、列出目录下的文件等。此外,File 类还支持跨平台操作,确保在不同操作系统中的一致性。 ... [详细]
  • 本文提供了在Windows系统上部署和启动MySQL免安装版本的详细步骤。首先,从MySQL官方网站下载社区版免安装包(https://dev.mysql.com/downloads/mysql/8.0.html),将其解压至指定目录,例如D:\tools\mysql。接着,配置系统环境变量,确保MySQL命令行工具可以在任意路径下使用。此外,还需创建并配置my.ini文件以设置MySQL的基本参数,确保数据库服务能够顺利启动和运行。 ... [详细]
author-avatar
le__citron
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有